#
# sdcc project main Makefile
#

SHELL           = /bin/sh

VPATH           = @srcdir@
srcdir          = @srcdir@
top_builddir    = @top_builddir@
top_srcdir      = @top_srcdir@

EXEEXT          = @EXEEXT@

include Makefile.common

SDCC_LIBS       = support/makebin
SDCC_SCRIPTS    = support/scripts
SDCC_DOC        = doc

# Parts that are not normally compiled but need to be cleaned
SDCC_EXTRA      = support/regression support/valdiag

SDCC_PACKIHX    = support/packihx
SDCC_SDBINUTILS = support/sdbinutils

ifneq ($(OPT_DISABLE_HC08)$(OPT_DISABLE_S08), 11)
SDCC_AS        += sdas/as6808
SDCC_LD        += sdcc-ld6808
endif

ifneq ($(OPT_DISABLE_MOS6502)$(OPT_DISABLE_MOS65C02), 11)
SDCC_AS        += sdas/as6500
SDCC_LD        += sdcc-ld6808
endif

ifeq ($(OPT_DISABLE_STM8), 0)
SDCC_AS        += sdas/asstm8
SDCC_LD        += sdcc-ldstm8
endif

ifneq ($(OPT_DISABLE_DS390)$(OPT_DISABLE_DS400), 11)
SDCC_AS        += sdas/as8xcxxx
endif

ifeq ($(OPT_DISABLE_MCS51), 0)
SDCC_AS        += sdas/as8051
SDCC_LD        += sdcc-ld8051
SDCC_MISC      += debugger/mcs51
endif

ifneq ($(OPT_DISABLE_Z80)$(OPT_DISABLE_Z180)$(OPT_DISABLE_Z80N)$(OPT_DISABLE_R800), 1111)
SDCC_AS        += sdas/asz80
SDCC_LD        += sdcc-ldz80
endif

ifneq ($(OPT_DISABLE_R2K)$(OPT_DISABLE_R2KA)$(OPT_DISABLE_R3KA), 111)
SDCC_AS        += sdas/asrab
SDCC_LD        += sdcc-ldz80
endif

ifeq ($(OPT_DISABLE_TLCS90), 0)
SDCC_AS        += sdas/astlcs90
endif

ifeq ($(OPT_DISABLE_SM83), 0)
SDCC_AS        += sdas/asgb
SDCC_LD        += sdcc-ldgb
endif

ifeq ($(OPT_DISABLE_PDK13), 0)
SDCC_AS        += sdas/aspdk13
SDCC_LD        += sdcc-ldpdk
endif

ifeq ($(OPT_DISABLE_PDK14), 0)
SDCC_AS        += sdas/aspdk14
SDCC_LD        += sdcc-ldpdk
endif

ifeq ($(OPT_DISABLE_PDK15), 0)
SDCC_AS        += sdas/aspdk15
SDCC_LD        += sdcc-ldpdk
endif

ifeq ($(OPT_DISABLE_PDK16), 0)
SDCC_AS        += sdas/aspdk16
SDCC_LD        += sdcc-ldpdk
endif

ifeq ($(OPT_DISABLE_F8), 0)
SDCC_AS        += sdas/asf8
SDCC_LD        += sdcc-ldf8
endif


ifeq ($(OPT_DISABLE_UCSIM), 0)
TARGETS        += sdcc-misc
SDCC_MISC      += sim/ucsim
PKGS           += $(SDCC_MISC)
endif

SDCC_BINUTILS   = 
ifeq ($(OPT_DISABLE_SDBINUTILS), 0)
TARGETS        += sdcc-sdbinutils
PKGS           += $(SDCC_SDBINUTILS)
SDCC_BINUTILS   = sdcc-sdbinutils
endif

ifeq ($(OPT_DISABLE_DEVICE_LIB), 0)
TARGETS        += sdcc-device-lib
PKGS           += device/lib
ifeq ($(OPT_DISABLE_NON_FREE), 0)
PKGS           += device/non-free/lib
endif
endif

ifeq ($(OPT_DISABLE_PACKIHX), 0)
TARGETS        += sdcc-packihx
PKGS           += $(SDCC_PACKIHX)
endif

ifeq ($(OPT_ENABLE_DOC), 1)
TARGETS        += sdcc-doc
endif
# always install docs, which don't need to be built
PKGS            += $(SDCC_DOC)

ifeq ($(OPT_DISABLE_SDCPP), 0)
SDCC_LIBS      += support/cpp
endif

TARGETS        += sdcc-libs sdcc-cc sdcc-device-inc sdcc-as sdcc-ld sdcc-scripts

PKGS           += $(SDCC_LIBS) src device/include
ifeq ($(OPT_DISABLE_NON_FREE), 0)
PKGS           += device/non-free/include
endif
PKGS           += $(SDCC_AS) sdas/linksrc $(SDCC_SCRIPTS)

PORTS           = $(shell cat ports.build)
ALLPORTS        = $(shell cat ports.all)

# Compiling entire program or any subproject
# ------------------------------------------
all: checkconf sdcc

tini: checkconf sdcc-tini

sdcc-libs: ${SDCC_BINUTILS}
	for lib in $(SDCC_LIBS); do $(MAKE) -C $$lib; done

sdcc-cc: sdcc-libs
	$(MAKE) -C src

sdcc-as:
	$(foreach as, $(SDCC_AS), $(MAKE) -C $(as) &&) echo "Assemblers built successfully."

sdcc-ld:
	$(MAKE) -C sdas/linksrc $(SDCC_LD)

sdcc-misc:
	for misc in $(SDCC_MISC); do $(MAKE) -C $$misc ; done

sdcc-scripts:
	$(MAKE) -C $(SDCC_SCRIPTS)

sdcc-packihx:
	$(MAKE) -C $(SDCC_PACKIHX)

sdcc-sdbinutils:
	$(MAKE) -C $(SDCC_SDBINUTILS)

sdcc-device-inc:
	$(MAKE) -C device/include
ifeq ($(OPT_DISABLE_NON_FREE), 0)
	$(MAKE) -C device/non-free/include
endif

sdcc-device-lib: sdcc-cc sdcc-as sdcc-ld $(SDCC_BINUTILS)
	$(MAKE) -C device/lib
ifeq ($(OPT_DISABLE_NON_FREE), 0)
	$(MAKE) -C device/non-free/lib
endif

sdcc-device-tini:
	$(MAKE) -C device/include
ifeq ($(OPT_DISABLE_NON_FREE), 0)
	$(MAKE) -C device/non-free/include
endif
	$(MAKE) -C device/lib model-ds390 model-ds400

# doc depends on latex and latex2html
sdcc-doc:
	$(MAKE) -C doc

sdcc: $(TARGETS)

sdcc-tini: sdcc-cc sdcc-as sdcc-ld sdcc-device-tini sdcc-packihx
	$(MAKE) -f main.mk all

# Some interesting sub rules
sdcc-bin: sdcc-cc sdcc-as sdcc-ld sdcc-misc

sdcc-base: sdcc-cc sdcc-as sdcc-ld

# Compiling and installing everything and running test
# ----------------------------------------------------
install: checkconf sdcc
	$(MAKE) -f main.mk install
	@for pkg in $(PKGS); do\
	  $(MAKE) -C $$pkg install ;\
	done

# Deleting all the installed files
# --------------------------------
uninstall:
	$(MAKE) -f main.mk uninstall
	@for pkg in $(PKGS); do\
	  $(MAKE) -C $$pkg uninstall ;\
	done

# Deleting all files created by building the program
# --------------------------------------------------
clean:
	@echo "+ Cleaning root of the project..."
	$(MAKE) -f $(srcdir)/clean.mk clean
	@echo "+ Cleaning packages in their directories..."
	for pkg in $(PKGS); do\
	  $(MAKE) -C $$pkg PORTS="$(PORTS)" EXEEXT=$(EXEEXT) clean ;\
	done

# Deleting all files created by configuring or building the program
# -----------------------------------------------------------------
distclean:
	@echo "+ DistCleaning packages using clean.mk..."
	for pkg in $(PKGS); do\
	  $(MAKE) -C $$pkg PORTS="$(PORTS)" EXEEXT=$(EXEEXT) distclean ;\
	done
	for pkg in $(SDCC_EXTRA); do \
	  $(MAKE) -C $$pkg distclean; \
	done
	@echo "+ DistCleaning root of the project..."
	$(MAKE) -f $(srcdir)/clean.mk distclean

# Like clean but some files may still exist
# -----------------------------------------
mostlyclean: clean
	$(MAKE) -f $(srcdir)/clean.mk mostlyclean
	for pkg in $(PKGS); do\
	  $(MAKE) -C $$pkg PORTS="$(PORTS)" EXEEXT=$(EXEEXT) mostlyclean ;\
	done

# Deleting everything that can reconstructed by this Makefile. It deletes
# everything deleted by distclean plus files created by bison, stc.
# -----------------------------------------------------------------------
realclean: distclean
	$(MAKE) -f $(srcdir)/clean.mk realclean
	for pkg in $(PKGS); do\
	  $(MAKE) -C $$pkg PORTS="$(PORTS)" EXEEXT=$(EXEEXT) realclean ;\
	done

# Performing self-test
# --------------------
check:

# Performing installation test
# ----------------------------
installcheck:

# Creating dependencies
# ---------------------
dep: $(SDCC_LIBS)
	$(MAKE) -f main.mk dep
	@for pkg in $(PKGS); do\
	  $(MAKE) -C $$pkg dep ;\
	done

# My rules
# --------
newer: distclean
	@if [ -f start ]; then \
	  tar cvf - \
	    `find . -newer start -type f -print` |\
	  gzip -9c >`date '+%m%d%H%M'`.tgz; \
	else \
	  echo "start file not found.\n"; \
	  exit 1; \
	fi

putcopyright:
	'put(c)' -s $(STARTYEAR) *.cc *.h *.y *.l

# Remaking configuration
# ----------------------
configure: configure.in
	$(SHELL) $(AUTOCONF)

main.mk: $(srcdir)/main_in.mk $(srcdir)/configure.in config.status
	$(SHELL) ./config.status

Makefiles: makefiles

makefiles: config.status

config.status: configure
	$(SHELL) ./config.status --recheck

makefiles:
	$(SHELL) ./config.status

freshconf: main.mk

checkconf:
	@if [ -f devel ]; then\
	  $(MAKE) freshconf;\
	fi

# End of Makefile
#
Makefile: $(srcdir)/Makefile.in
	 cd $(top_builddir); ./config.status Makefile

Makefile.common: $(srcdir)/Makefile.common.in
	 cd $(top_builddir); ./config.status Makefile.common
